package com.demo.hjh.thread.volatiles;

public class TraditionalThreadSynchronized {  
	
	
	
    public static void main(String[] args) {  
        final Outputter2 output = new Outputter2();  
        new Thread() {  
            public void run() {  
                output.output("zhangsan");  
            }  
        }.start();        
        new Thread() {  
            public void run() {  
                output.output("lisi");  
            }  
        }.start();  
    }  
}  

class Outputter {  
    public void output(String name) {  
        // TODO 为了保证对name的输出不是一个原子操作，这里逐个输出name的每个字符  
        for(int i = 0; i < name.length(); i++) {  
            System.out.print(name.charAt(i));  
            // Thread.sleep(10);  
        }  
    }  
}  
class Outputter1 {  //使用synchronized将需要互斥的代码包含起来，并上一把锁。
    public void output(String name) {  
    	synchronized(this) {  
        // TODO 为了保证对name的输出不是一个原子操作，这里逐个输出name的每个字符  
        for(int i = 0; i < name.length(); i++) {  
            System.out.print(name.charAt(i));  
            // Thread.sleep(10);  
        }  
    	}
    }  
}  

class Outputter2 {  //使用synchronized将需要互斥的代码包含起来，并上一把锁。
	Object lock = new Object();
    public void output(String name) { 
    	
    	synchronized(lock) {  
        // TODO 为了保证对name的输出不是一个原子操作，这里逐个输出name的每个字符  
        for(int i = 0; i < name.length(); i++) {  
            System.out.print(name.charAt(i));  
            // Thread.sleep(10);  
        }  
    	}
    }  
}
